package com.shujia.sql

import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo1SparkSessio {
  def main(args: Array[String]): Unit = {

    /**
      * SparkSession : spark 2.0提供的新的入口
      *
      * 新版本统一的入口
      */

    val spark: SparkSession = SparkSession
      .builder()
      .master("local")


      //指定spark sql shuffle 之后df 分区的数量，默认是200
      .config("spark.sql.shuffle.partitions", 2)
      .appName("spark")
      .getOrCreate()

    //获取sparkContet
    //val sc: SparkContext = spark.sparkContext

    /**
      * DataFrame : 在RDD的基础上增加了列名
      * 相当于一张表
      *
      */


    //spark sql 读取数据的方式
    val studentDF: DataFrame = spark.read.json("spark/data/students.json")

    //查看表结构
    studentDF.printSchema()

    /**
      * show： 查看数据，相当于action算子
      *
      */

    studentDF.show()
    studentDF.show(100)
    studentDF.show(false) //完整显示数据


    /**
      * DSL 语句： 类sql语句， 介于sql和代码中间的api
      *
      */


    studentDF
      .where(" age > 22")
      .select("id")
      .show()


    //统计班级的人数
    studentDF
      .groupBy("clazz")
      .count()
      .show()


    /**
      * 创建临时试图'
      *
      */
    studentDF.createOrReplaceTempView("student")


    /**
      *
      * 通过spark 编写sql  ,返回一个新的DataFrame
      *
      */
    val clazzCount: DataFrame = spark.sql(
      """
        |select clazz,count(1) as c
        |from student
        |group by clazz
        |
        |
      """.stripMargin)


    /**
      * 保存数据'
      *
      */

    clazzCount
      .write
      .mode(SaveMode.Overwrite) //如果输出目录已存在自动覆盖
      .json("spark/data/clazz_count")

  }

}
